import { isObject, isString } from "@/utils/is";
import { Recordable } from "@/pages/draft/components/types";

const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";

export function joinTimestamp<T extends boolean>(
  join: boolean,
  restful: T,
): T extends true ? string : object;

/**
 * 将时间戳与其他参数连接起来
 * @param join - 是否连接时间戳
 * @param restful - 是否使用 RESTful 格式
 * @returns - 连接后的字符串或对象
 */
export function joinTimestamp(join: boolean, restful = false): string | object {
  // 如果不需要连接时间戳
  if (!join) {
    // 如果使用 RESTful 格式，返回空字符串；否则返回空对象
    return restful ? "" : {};
  }

  // 获取当前时间戳
  const now = new Date().getTime();

  // 如果使用 RESTful 格式，返回带时间戳的查询字符串
  if (restful) {
    return `?_t=${now}`;
  }

  // 返回带时间戳的对象
  return { _t: now };
}
/**
 * 格式化请求参数中的日期
 * @param params 请求参数
 */
export function formatRequestDate(params: Recordable) {
  // 判断params是否为对象
  if (Object.prototype.toString.call(params) !== "[object Object]") {
    return;
  }

  // 遍历params的属性
  for (const key in params) {
    // 判断属性值是否为moment对象
    if (params[key] && params[key]._isAMomentObject) {
      // 格式化日期并赋值给属性
      params[key] = params[key].format(DATE_TIME_FORMAT);
    }

    // 判断属性名是否为字符串
    if (isString(key)) {
      const value = params[key];
      // 判断属性值是否存在
      if (value) {
        try {
          // 去除字符串两端的空格或将其他类型值保持不变
          params[key] = isString(value) ? value.trim() : value;
        } catch (error: any) {
          // 抛出错误
          throw new Error(error);
        }
      }
    }

    // 判断属性值是否为对象，递归调用格式化函数
    if (isObject(params[key])) {
      formatRequestDate(params[key]);
    }
  }
}
